//  第一题:
// 函数的链式调用

var pipe= function(value) {};

// 思路:
// 这种属性实现逻辑操作的都是通过代理拦截实现对应的逻辑
// 并且传入的值将被保存顺序的交给每一个函数处理(对递归或者迭代)
// 当访问的是do属性以后就开始执行函数


var pipe = function(value) {
    let fnArr = [];
    return new Proxy({}, {
        get: function(target, property, receiver) {
            if (property === 'do') {
                // 迭代执行函数
                const res = fnArr.reduce((pre, nxt) => {
                    return nxt(pre);
                }, value)
                return res;
            } else {
                // 因为var声明已经将函数挂到了window下
                fnArr.push(window[property]);
                // 因为需要链式调用
                return receiver;
            }
        }
    })
}

var add= (n) => n + 2;
var sub = (n) => n - 2;
var dobule = (n) => n * 2;
var pow = (n) => Math.pow(n, n);

var res1 = pipe(2).dobule.pow.do; // 256
var res2 = pipe(4).add.dobule.do;// 12
var res3 = pipe(6).sub.add.dobule.do;// 12
console.log(res1, res2, res3);


